# @Time : 2020/7/3 9:13
# @Author : Fioman 
# @Phone : 13149920693
"""
我们面向对象的语言至少都有一种获取对象的字符串表示形式的标准方式.Python提供了两种方式.
repr() 以便于开发者理解的方式返回对象的字符串表示形式
str() 以便于用户理解的方式返回对象的字符串表示形式
在python3中,__repr__,__str__和__format__都必须返回Unicode字符串(str类型).只有__bytes__方法应该返回字节序列(bytes类型)
"""
from array import array
import math


class Vector2d(object):
    typecode = "d"  # 1.typecode是类属性,在Vector2d实例和直接序列之间转换时使用.

    def __init__(self, x, y):  # 在__init__方法中把x和y转换成浮点数,尽早捕获错误,以防止调用Vector2d函数时传入不当参数
        self.x = float(x)
        self.y = float(y)

    # 定义__iter__方法,把Vector2d实例变成可迭代对象,这样才能拆包(例如,x,y = my_vector).这个方法的实现很简单,
    # 直接调用生成器表达式一个接一个产出分量
    def __iter__(self):
        return (i for i in (self.x, self.y))

    # __repr__方法使用{!r}获取各个分量的表示形式,然后插值,构成一个字符串;因为Vector2d实例是可迭代对象.
    # 所以*self会把x和y分量供给format函数
    def __repr__(self):
        class_name = type(self).__name__
        return "{}({!r},{!r})".format(class_name, *self)

    # 从可迭代的vector2d中轻松获取一个元组,显示为一个序列
    def __str__(self):
        return str(tuple(self))

    # 为了生成字节序列,我们把typecode转转成字节序列,然后.......
    # 迭代Vector2d实例,得到一个数组,再把数组转转成字节序列
    def __bytes__(self):
        return (bytes([ord(self.typecode)]) + bytes(array(self.typecode, self)))

        # 为了尽快的比较所有分量,在操作数中构建元组,对Vector2d实例来说,可以这样做,不过仍然有问题

    def __eq__(self, other):
        return tuple(self) == tuple(other)

    #
